package com.example.ttt.functions;

import lombok.extern.slf4j.Slf4j;
import org.bytedeco.javacpp.Loader;

import java.io.File;
import java.io.IOException;
import java.util.Optional;

/*
 * 转换音频格式
 * 由于目前所依赖的maven仓库太大了，需要优化使用另一种方式
 * */

@Slf4j
public class TransferAudio {

    private String path = TransferAudio.class.getClassLoader().getResource("static/back_left.png").getPath();
    public String newPath;

    public String transfer(
            String localPath,
            String fileName
    ) throws Exception {

        // 判断文件的大小是否符合要求
        File file = new File(localPath);
        if (file.length() <= 1 || !file.exists() || !file.isFile()){
            log.info("文件为空/异常文件/文件不存在-无法播放：",localPath);
            file.exists();
            return "";
        }

        // 去掉多余的后缀文件名
        String replace = path.replace("back_left.png", "-");
        String substring = replace.substring(1, replace.length());
        String replace1 = fileName.replace(".", "-");
        String resultPath = substring + replace1 + ".wav";

        Optional<String> transPath = Optional.empty();
        try {
            transPath = transformWavStandard(localPath, resultPath);
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        if (transPath.isPresent()) {
            return transPath.get();
        } else {
            throw new Exception("音频转换失败失败");
        }
    }


    public Optional<String> transformWavStandard(String oldFilePath, String newFilePath) {
        // 获取本地ffmpeg执行器
        String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
        // 生成转换命令管道
        ProcessBuilder transferBuilder =
                new ProcessBuilder(
                        ffmpeg, "-i", oldFilePath, "-f", "wav", "-ar", "16000", "-ac", "1", "-y", newFilePath);
        try {
            // inheritIO是指将 子流程的IO与当前java流程的IO设置为相同
            transferBuilder.inheritIO().start().waitFor();
        } catch (InterruptedException | IOException e) {
            log.error("ffmpeg转换wav为标准格式异常", e);
            return Optional.empty();
        }
        // 返回pcm文件路径
        newPath = newFilePath;
        return Optional.of(newFilePath);
    }
}
